package gestion.camping.vue;

import gestion.camping.controleur.EmplacementController;
import gestion.camping.dto.Emplacement;
import gestion.camping.dto.Secteur;
import gestion.camping.dto.TypeTerrain;
import gestion.camping.utils.MessagesUtil;

import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.List;

import javax.swing.JButton;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JLabel;
import javax.swing.JTextField;
import javax.swing.JComboBox;

public class ViewEmplacementListe extends JPanel implements ActionListener{
	/**
	 * 
	 */
	private static final long serialVersionUID = -1923064145354238975L;
	
	private TableEmplacement table;

	private List<Emplacement> listEmplacement;
	private EmplacementController controller;
	private JButton btnRechercher;
	private JButton btnValider;
	private JButton btnAjouter;
	private JLabel lblNumro;
	private JTextField textFieldNum;
	private JLabel lblSecteur;
	private JLabel lblNewLabel;
	private JComboBox comboBoxSecteur;
	private JComboBox comboBoxTypeTerrain;
	private List<Secteur> listSecteur = new ArrayList<Secteur>();
	private List<TypeTerrain> listTypeTerrain = new ArrayList<TypeTerrain>();

	/**
	 * Create the panel.
	 */
	public ViewEmplacementListe(EmplacementController controller) {
	
		this.controller = controller;
		
		this.listEmplacement = controller.getListEmplacement();
		
		initCompoment();
		
		setListSecteur(controller.getListSecteur());
		setListTypeTerrain(controller.getListTypeTerrain());
	}
	
	public void initCompoment(){
	
		setBounds(0, 25, 1150, 700);
		GridBagLayout gridBagLayout = new GridBagLayout();
		gridBagLayout.columnWidths = new int[]{0, 0, 0, 0, 0, 0, 156, 0, 0};
		gridBagLayout.rowHeights = new int[]{0, 0, 44, 0, 0, 0, 0};
		gridBagLayout.columnWeights = new double[]{0.15, 0.0, 1.0, 1.0, 0.0, 1.0, 0.2, 1.0, 0.15};
		gridBagLayout.rowWeights = new double[]{0.1, 0.0, 1.0, 1.0, 0.0, 0.5, 0.1};
		setLayout(gridBagLayout);
		
		btnRechercher = new JButton(MessagesUtil.formatMessage("emplacement.liste.btn.rechercher"));
		btnRechercher.addActionListener(this);
		
		lblNumro = new JLabel(MessagesUtil.formatMessage("emplacement.liste.numero"));
		GridBagConstraints gbc_lblNumro = new GridBagConstraints();
		gbc_lblNumro.anchor = GridBagConstraints.EAST;
		gbc_lblNumro.insets = new Insets(0, 0, 5, 5);
		gbc_lblNumro.gridx = 1;
		gbc_lblNumro.gridy = 2;
		add(lblNumro, gbc_lblNumro);
		
		textFieldNum = new JTextField();
		GridBagConstraints gbc_textFieldNum = new GridBagConstraints();
		gbc_textFieldNum.insets = new Insets(0, 0, 5, 5);
		gbc_textFieldNum.fill = GridBagConstraints.HORIZONTAL;
		gbc_textFieldNum.gridx = 2;
		gbc_textFieldNum.gridy = 2;
		add(textFieldNum, gbc_textFieldNum);
		textFieldNum.setColumns(10);
		
		lblNewLabel = new JLabel(MessagesUtil.formatMessage("emplacement.liste.secteur"));
		GridBagConstraints gbc_lblNewLabel = new GridBagConstraints();
		gbc_lblNewLabel.anchor = GridBagConstraints.EAST;
		gbc_lblNewLabel.insets = new Insets(0, 0, 5, 5);
		gbc_lblNewLabel.gridx = 4;
		gbc_lblNewLabel.gridy = 2;
		add(lblNewLabel, gbc_lblNewLabel);
		
		comboBoxSecteur = new JComboBox();
		GridBagConstraints gbc_comboBoxSecteur = new GridBagConstraints();
		gbc_comboBoxSecteur.insets = new Insets(0, 0, 5, 5);
		gbc_comboBoxSecteur.fill = GridBagConstraints.HORIZONTAL;
		gbc_comboBoxSecteur.gridx = 5;
		gbc_comboBoxSecteur.gridy = 2;
		add(comboBoxSecteur, gbc_comboBoxSecteur);
		
		lblSecteur = new JLabel(MessagesUtil.formatMessage("emplacement.liste.typeTerrain"));
		GridBagConstraints gbc_lblSecteur = new GridBagConstraints();
		gbc_lblSecteur.anchor = GridBagConstraints.EAST;
		gbc_lblSecteur.insets = new Insets(0, 0, 5, 5);
		gbc_lblSecteur.gridx = 6;
		gbc_lblSecteur.gridy = 2;
		add(lblSecteur, gbc_lblSecteur);
		
		comboBoxTypeTerrain = new JComboBox();
		GridBagConstraints gbc_comboBoxTypeTerrain = new GridBagConstraints();
		gbc_comboBoxTypeTerrain.insets = new Insets(0, 0, 5, 5);
		gbc_comboBoxTypeTerrain.fill = GridBagConstraints.HORIZONTAL;
		gbc_comboBoxTypeTerrain.gridx = 7;
		gbc_comboBoxTypeTerrain.gridy = 2;
		add(comboBoxTypeTerrain, gbc_comboBoxTypeTerrain);
		GridBagConstraints gbc_btnRechercher = new GridBagConstraints();
		gbc_btnRechercher.anchor = GridBagConstraints.EAST;
		gbc_btnRechercher.insets = new Insets(0, 0, 5, 5);
		gbc_btnRechercher.gridx = 7;
		gbc_btnRechercher.gridy = 4;
		add(btnRechercher, gbc_btnRechercher);
		
		table = new TableEmplacement();
		
		GridBagConstraints gbc_table = new GridBagConstraints();
		gbc_table.gridwidth = 7;
		gbc_table.insets = new Insets(0, 0, 5, 5);
		gbc_table.fill = GridBagConstraints.BOTH;
		gbc_table.gridx = 1;
		gbc_table.gridy = 5;
		JScrollPane scrollPane = new JScrollPane(table);
		add(scrollPane, gbc_table);
		
		btnAjouter = new JButton(MessagesUtil.formatMessage("emplacement.ajout.title"));
		btnAjouter.addActionListener(this);
		GridBagConstraints gbc_btnAjouter = new GridBagConstraints();
		gbc_btnAjouter.anchor = GridBagConstraints.EAST;
		gbc_btnAjouter.insets = new Insets(0, 0, 0, 5);
		gbc_btnAjouter.gridx = 6;
		gbc_btnAjouter.gridy = 6;
		add(btnAjouter, gbc_btnAjouter);
		
		btnValider = new JButton(MessagesUtil.formatMessage("emplacement.liste.btn.modifier"));
		btnValider.addActionListener(this);
		GridBagConstraints gbc_btnValider = new GridBagConstraints();
		gbc_btnValider.anchor = GridBagConstraints.WEST;
		gbc_btnValider.insets = new Insets(0, 0, 0, 5);
		gbc_btnValider.gridx = 7;
		gbc_btnValider.gridy = 6;
		add(btnValider, gbc_btnValider);
		
	}

	public List<Emplacement> getListEmplacement() {
		return listEmplacement;
	}

	public void setListEmplacement(List<Emplacement> listEmplacement) {
		this.listEmplacement = listEmplacement;
		
		update();
	}
	
	private void update(){
		int indexElementSelected = table.getSelectedRow();
		
		table.setModel(new TableEmplacementModel(listEmplacement, table.getColumnNames()));
		table.setShowGrid(true);
		table.setVisible(true);
		
		//Mise à jour de la liste déroulante
	    //Supprime tout les anciens éléments
		comboBoxSecteur.removeAllItems();
		
		//On ajoute le choix vide
		comboBoxSecteur.addItem(null);
		
		// On insère ensuite les nouvelles valeurs
		for(Secteur secteur : listSecteur){
			comboBoxSecteur.addItem(secteur.getLibelle());
		}
		
		//On pr�selectionne l'�l�ment
		int i;
		if(controller.getSecteur() != null){
			for(i=0; i < listSecteur.size() && listSecteur.get(i).getId() != controller.getSecteur().getId(); i++);
			if(i < listSecteur.size()){
				comboBoxSecteur.setSelectedIndex(i+1);
			}
		}
		
		
		//Mise à jour de la liste déroulante
	    //Supprime tout les anciens éléments
		comboBoxTypeTerrain.removeAllItems();
		
		//On ajoute le choix vide
		comboBoxTypeTerrain.addItem(null);
		
		// On insère ensuite les nouvelles valeurs
		for(TypeTerrain typeTerrain : listTypeTerrain){
			comboBoxTypeTerrain.addItem(typeTerrain.getLibelle());
		}
		
		//On pr�selectionne l'�l�ment
		if(controller.getTypeTerrain() != null){
			for(i=0; i < listTypeTerrain.size() && listTypeTerrain.get(i).getId() != controller.getTypeTerrain().getId(); i++);
			if(i < listTypeTerrain.size()){
				comboBoxTypeTerrain.setSelectedIndex(i+1);
			}
		}
		
		this.repaint();
		
		if(indexElementSelected >= 0){
			table.setRowSelectionInterval(indexElementSelected, indexElementSelected);
		}
	}

	@Override
	public void actionPerformed(ActionEvent e) {
				
		if(e.getSource() == btnRechercher){
			Integer numero = textFieldNum.getText().equals("")? null : Integer.valueOf(textFieldNum.getText());
			Secteur secteur = comboBoxSecteur.getSelectedItem() == null ? null : listSecteur.get(comboBoxSecteur.getSelectedIndex()-1);
			TypeTerrain typeTerrain = comboBoxTypeTerrain.getSelectedItem() == null ? null : listTypeTerrain.get(comboBoxTypeTerrain.getSelectedIndex()-1);
			this.controller.rechercher(numero, secteur , typeTerrain);
		}else if(e.getSource() == btnValider){
			Emplacement selectedPersonne = listEmplacement.get(this.table.getSelectedRow());			
			
			this.controller.modifier(selectedPersonne);
		}else if(e.getSource() == btnAjouter){
			this.controller.ajouter();
		}
		
	}
	
	public Emplacement getSelectedEmplacement(){	
		return table.getSelectedRow() < 0 ? null : listEmplacement.get(table.getSelectedRow());
	}
	
	public void setListSecteur(List<Secteur> listSecteur) {
		this.listSecteur = listSecteur;
		
		update();
	}

	public void setListTypeTerrain(List<TypeTerrain> listTypeTerrain) {
		this.listTypeTerrain = listTypeTerrain;
		
		update();
	}

}
